package com.neusoft.ch5.oop;

/*
 * 课堂笔记：
 *    1、面向对象的核心思想
 *      面向对象是一种思维方法、解决问题的方法论、看待问题的角度
 *      面向对象：找谁去做。（谁就是对象）
 *      面向过程：如何去做。（过程细节）
 *      
 *      面向对象的思想是对现实世界的一种映射。
 *    
 *    2、对象
 *      什么是对象？
 *      java说，万物皆对象；
 *        
 *    3、对象如何在编程中进行规范定义
 *      java中使用类对对象进行规范定义。  
 *      类class是java中对对象的定义声明；
 *      类从两个维度进行规范定义对象：
 *         属性（成员变量）；
 *         行为（成员方法）；
 *         
 *      类是对一类对象在属性和行为上的抽象概括；   
 *    4、抽象
 *      抽象是从个体到一般，从具体到概括的一个过程；
 *      在面向对象的思想中：
 *         抽象是在问题域中将一类对象每个个体的共同的属性和行为的抽象概括； 
 *      抽象的结果是获取了这一类对象在问题域中的共同的属性和行为；   
 *    5、封装
 *      封装是将抽象的共同的属性和行为以成员变量和成员方法的形式写在class中；
 *      这样，class类就从属性和行为两个维度对对象进行规范定义；
 *      实例对象：就是使用类在内存中创建了一个类的个体；
 *      实例对象是类的一个个体，是使用对象规范定义（class类）创建出来的；  
 *    5.1 访问控制修饰符
 *      封装的另外一个维度就是访问控制修饰符；
 *      访问控制修饰符是用于控制被修饰内容的访问权限的；
 *      访问控制修饰符：
 *                   public        protected           默认的                                  private
 *      访问范围：            所有的类都        所有子类及同包的类                    同包的类（同包子类）           当前类自己
 *                   可以访问
 *      
 *      注意：public表示所有的外部类都可以访问或者调动该属性或行文方法；
 *          private表示只有在当前类的内部才能够访问或者调用该属性或行为方法；
 *      在封装的时候，类的属性或者行为也是需要访问控制修饰符控制其可以被访问的范围
 *      （访问控制修饰符也是封装时需要控制的一个维度）；
 *      一般原则：类在进行封装时，
 *                一般属性（成员变量）被封装为private类型；
 *                一般行为（成员方法）被封装为public类型；
 *   5.2 属性（成员变量）
 *      类中定义的变量就是成员变量；   
 *      定义在方法中、语句块中的变量就是局部变量；
 *      附：语句块是指单独存在的成对的{}
 *      
 *      成员变量和局部变量的异同点：
 *         相同点：
 *              声明语法一样；
 *              命名规范一样；
 *         不同点：
 *              声明的位置不同——成员变量声明在类中，局部变量声明在方法或语句块中（形参也是局部变量）；
 *              
 *              成员变量有默认值（和数组默认值一样），使用之前不需要进行初始化；
 *              默认值：
 *                    char  byte  short int long  float   double   boolean  对象类型    String
 *                    '\0'   0     0    0   0      0.0f     0.0    false     null    null
 *              局部变量没有默认值，使用之前一定要进行初始化赋值；
 *              
 *              生命周期作用域范围不一样——成员变量的生命周期范围是伴随整个类的实例对象的存在而存在；
 *                              局部变量是从局部变量声明位置到其所在的方法或语句块结束为止；    
 *              
 *              成员变量可以使用访问控制修饰符进行修饰；
 *              局部变量不可以使用访问控制修饰符进行修饰；
 *         
 *      注意：
 *          当局部变量和成员变量名字相同时，局部变量的优先级高，局部变量的值会覆盖同名的成员变量的值；
 *          （就近原则）（范围最小有限原则）
 *          当局部变量和成员变量同名时，局部变量会覆盖成员变量，则可以使用“this.成员变量”的方式，引用成员变量的值；   
 *          可以使用this引用同名的成员变量；
 *   5.3 成员变量的初始和赋值
 *       (1) 如果外部可以直接访问到成员变量，则可以直接进行赋值即可；
 *           一般成员变量都是private类型，外部无法访问；
 *           一般不推荐；
 *       (2) 通过getter/setter方法对成员变量进行赋值或者读取操作。
 *           一般是约定俗成，使用getter/setter进行成员变量的操作；
 *           一般都会给成员变量提供getter/setter方法接口，方便于外部类对成员变量的访问
 *           set首字母大写的成员变量名
 *           get首字母大写的成员变量名
 *           可以使用ide自动生成工具，鼠标右键-->source-generater getter/setter接口
 *       (3) 通过构造方法对成员变量进行赋值初始化
 *           构造方法：就在创建该类的实例对象的时候所调用的方法就是该类的构造方法；
 *                   就也是在new时所调用的方法，就是构造方法；    
 *           语法：
 *               访问控制修饰符  类名(构造方法形参列表){
 *                   构造方法体；
 *               } 
 *           解析：
 *               一般构造方法是public类型，方便外部调用；也可以是其他类型的访问控制修饰符；
 *                   例如如果是private类型则，外部无法访问；
 *               构造方法的方法名和类名是一样的；
 *               ide自动生成的方式：鼠标右键-->source-generater constructor接口    
 *               构造方法没有返回值类型；
 *           注意：
 *               一般jvm都会自动给每个类提供一个不带参数的默认的构造方法，该构造方法一般不需要手动显式写出；
 *               但是如果有了其他自定义的的构造方法，则默认的构造方法不起作用，
 *               此时，如果需要调用默认构造方法时，需要手动显式写出；    
 */

public class OOPTest {

	public static void main(String[] args) {
		test03();

	}
	/**
	 * 通过构造方法接口初始化成员变量
	 */
	private static void  test03() {
		// 创建一个学生类的实例对象
		// stu0局部变量
		// 调用自定义构造方法给private类型的属性进行设置
		Student stu0 = new Student("小明3","15000101");		
		// 调用stu0实例对象的行为方法
		stu0.haveDinner();
		
	}
	
	/**
	 * 通过setter方法接口初始化成员变量
	 */
	private static void  test02() {
		// 创建一个学生类的实例对象
		// stu0局部变量
		Student stu0 = new Student();
		// 调用seter方法接口给private类型的属性进行设置
		stu0.setStuName("小明");
		
		// 调用stu0实例对象的行为方法
		stu0.haveDinner();
		
	}
	/**
	 * 通过外部可以访问属性直接初始化成员变量（不推荐）
	 */
	private static void  test01() {
		// 创建一个学生类的实例对象
		// stu0局部变量
		Student stu0 = new Student();
		// 如果成员变量可以直接访问，则可以进行赋值或读取操作
		stu0.stuName="xiaozhao2";
		// 调用stu0实例对象的行为方法
		stu0.haveDinner();
		
	}

}
